#include "util.hpp"
#include "config.hpp"
#include "data.hpp"
#include "hot.hpp"
#include "service.hpp"
#include <thread>

// 测试文件工具类
void FileUtilTest(const std::string &filename)
{
    // 测试获取文件的基本属性
    //  cloud::FileUtil fu(filename);
    //  std::cout << fu.Filesize() << std::endl;
    //  std::cout << fu.LastMTime() << std::endl;
    //  std::cout << fu.LastATime() << std::endl;
    //  std::cout << fu.FileName() << std::endl;

    // 测试文件内容的读取&写入
    // cloud::FileUtil fu(filename);
    // std::string body;
    // fu.GetContent(&body);
    // cloud::FileUtil nfu("./hello.txt");
    // nfu.SetContent(body);

    // 测试文件的解压缩
    std::string packname = filename + ".lz";
    cloud::FileUtil fu(filename);
    fu.Compress(packname);
    cloud::FileUtil pfu(packname);
    pfu.UnCompress("./hello.txt");

    // 测试文件创建目录&遍历目录
    // cloud::FileUtil fu(filename);
    // fu.CreateDirectory();
    // std::vector<std::string> arry;
    // fu.ScanDirectory(&arry);
    // for (auto &a : arry)
    // {
    //     std::cout << a << std::endl;
    // }

    return;
}

// 测试Json类
void JsonUtilTest()
{
    // 序列化
    Json::Value root;
    const char *name = "小连";
    int age = 22;
    float score[] = {90, 92.6, 98.7};
    root["姓名"] = name;
    root["年龄"] = age;
    root["成绩"].append(score[0]);
    root["成绩"].append(score[1]);
    root["成绩"].append(score[2]);
    std::string str;
    cloud::JsonUtil::Serialize(root, &str);
    std::cout << str << std::endl;

    // 反序列化
    Json::Value root1;
    cloud::JsonUtil::UnSerialize(str, &root1);
    std::cout << root["姓名"] << std::endl;
    std::cout << root["年龄"] << std::endl;
    for (int i = 0; i < root["成绩"].size(); i++)
    {
        std::cout << root["成绩"][i] << " ";
    }
    std::cout << std::endl;

    return;
}

// 测试系统配置信息
void ConfigTest()
{
    cloud::Config *config = cloud::Config::GetInstance();
    std::cout << config->GetHotTime() << std::endl;
    std::cout << config->GetServerPort() << std::endl;
    std::cout << config->GetServerIp() << std::endl;
    std::cout << config->GetDownloadPrefix() << std::endl;
    std::cout << config->GetPackFileSuffix() << std::endl;
    std::cout << config->GetPackDir() << std::endl;
    std::cout << config->GetBackDir() << std::endl;
    std::cout << config->GetBackupFile() << std::endl;

    return;
}

// 测试数据管理类
void DataTest(const std::string &filename)
{
    // 服务端可能要用到的数据
    // cloud::BackupInfo info;
    // info.NewBackupInfo(filename);
    // std::cout << info.pack_flag << std::endl;
    // std::cout << info.fsize << std::endl;
    // std::cout << info.atime << std::endl;
    // std::cout << info.mtime << std::endl;
    // std::cout << info.real_path << std::endl;
    // std::cout << info.pack_path << std::endl;
    // std::cout << info.url << std::endl;

    // 数据管理测试
    // cloud::DataManager data;
    // std::cout << "-----------Insert And GetOneByURL--------\n";
    // data.Insert(info);
    // cloud::BackupInfo tmp;
    // data.GetOneByURL("/download/cloud.cpp", &tmp);
    // std::cout << tmp.pack_flag << std::endl;
    // std::cout << tmp.fsize << std::endl;
    // std::cout << tmp.mtime << std::endl;
    // std::cout << tmp.atime << std::endl;
    // std::cout << tmp.real_path << std::endl;
    // std::cout << tmp.pack_path << std::endl;
    // std::cout << tmp.url << std::endl;

    // std::cout << "-----------Update And GetAll--------\n";
    // info.pack_flag = true;
    // data.Update(info);
    // std::vector<cloud::BackupInfo> arry;
    // data.GetAll(&arry);
    // for (auto &a : arry)
    // {
    //     std::cout << a.pack_flag << std::endl;
    //     std::cout << a.fsize << std::endl;
    //     std::cout << a.mtime << std::endl;
    //     std::cout << a.atime << std::endl;
    //     std::cout << a.real_path << std::endl;
    //     std::cout << a.pack_path << std::endl;
    //     std::cout << a.url << std::endl;
    // }
    // std::cout << "-----------GetOneByRealPath--------\n";
    // data.GetOneByRealPath(filename, &tmp);
    // std::cout << tmp.pack_flag << std::endl;
    // std::cout << tmp.fsize << std::endl;
    // std::cout << tmp.mtime << std::endl;
    // std::cout << tmp.atime << std::endl;
    // std::cout << tmp.real_path << std::endl;
    // std::cout << tmp.pack_path << std::endl;
    // std::cout << tmp.url << std::endl;

    // 数据持久化存储测试
    cloud::DataManager data;
    cloud::BackupInfo info;
    info.NewBackupInfo(filename);
    data.Insert(info);

    // 数据初始化加载测试
    // cloud::DataManager data;
    // std::vector<cloud::BackupInfo> arry;
    // data.GetAll(&arry);
    // for (auto &a : arry)
    // {
    //     std::cout << a.pack_flag << std::endl;
    //     std::cout << a.fsize << std::endl;
    //     std::cout << a.atime << std::endl;
    //     std::cout << a.mtime << std::endl;
    //     std::cout << a.real_path << std::endl;
    //     std::cout << a.pack_path << std::endl;
    //     std::cout << a.url << std::endl;
    // }
    return;
}

// 测试热点管理类
void HotTest()
{
    cloud::HotManager hot;
    hot.RunModule();
}

// 测试服服务器搭建&业务处理模块
void ServerTest()
{
    cloud::Service sv;
    sv.RunModule();
}

int main(int argc, char *argv[])
{
    // FileUtilTest(argv[1]);
    // JsonUtilTest();
    // ConfigTest();
    // DataTest(argv[1]);
    //HotTest();
    std::thread thread_hot(HotTest);
    std::thread thread_service(ServerTest);
    thread_hot.join();
    thread_service.join();
    return 0;
}